package com.zw.a.basic.a15.demo09_annotation_exercise;

//案例: 演示通过反射获取注解信息.
//注解常用的套路: 用注解的方式来替代配置文件, 然后通过反射的方式获取注解中的配置信息.    ***重要***

import java.lang.reflect.Method;
import java.util.Arrays;

/*
    注解解析介绍:
        概述:
            通过Java技术获取注解数据的过程则称为注解解析。
        涉及到的成员方法:
            •Anontation：所有注解类型的公共接口，类似所有类的父类是Object。
            •AnnotatedElement：定义了与注解解析相关的方法，常用方法以下四个：
                boolean isAnnotationPresent(Class annotationClass); 判断当前对象是否有指定的注解，有则返回true，否则返回false。
                T getAnnotation(Class<T> annotationClass);  获得当前对象上指定的注解对象。
                Annotation[] getAnnotations(); 获得当前对象及其从父类上继承的所有的注解对象。
                Annotation[] getDeclaredAnnotations();获得当前对象上所有的注解对象，不包括父类的。
 */
public class BookTest {
    public static void main(String[] args) throws NoSuchMethodException {
        //需求1: 获取BookShelf类上的注解
        method01();
        System.out.println("-------------------------------");

        //需求2: 获取showBook方法上的注解
        method02();
    }

    public static void method02() throws NoSuchMethodException {
        //1. 获取BookeShelf类的字节码文件对象.
        Class<BookShelf> clazz = BookShelf.class;
        //2. 根据字节码文件对象, 获取指定的方法对象.
        Method method = clazz.getMethod("showBook");
        //3. 判断showBook方法是否有Book注解.
        if(method.isAnnotationPresent(Book.class)) {
            //4. 如果有, 就获取showBook方法上的Book注解
            Book book = method.getAnnotation(Book.class);
            //5. 输出注解的值.
            System.out.println("书名: " + book.value());
            System.out.println("价格: " + book.price());
            System.out.println("作者: " + Arrays.toString(book.authors()));
        }
    }

    public static void method01() {
        //1. 获取BookeShelf类的字节码文件对象.
        Class<BookShelf> clazz = BookShelf.class;
        //2. 判断BookShelf类是否有Book注解.
        if(clazz.isAnnotationPresent(Book.class)) {
            //3. 如果有, 就获取BookShelf类上的Book注解
            Book book = clazz.getAnnotation(Book.class);
            //4. 输出注解的值.
            System.out.println("书名: " + book.value());
            System.out.println("价格: " + book.price());
            System.out.println("作者: " + Arrays.toString(book.authors()));
        }
    }
}
